﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using SosForms;
using SosData;
using SosBL;

namespace UOCmaker
{
    public partial class FormPlantilla : FormBase
    {

        #region " Contructores "

        /// <summary>
        /// Contructor
        /// </summary>
        public FormPlantilla()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Load form
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void FormPlantilla_Load(object sender, EventArgs e)
        {
            CargarGrupos();
            CargarPlantillas();

            this.lblTextoPlantilla.AutoSize = false;
            this.lblTextoPlantilla.Size = new System.Drawing.Size(this.txtPlantillaContenido.Width, 30);
        }

        #endregion

        #region " Variables "

        Plantilla _plantillaSeleccionada;
        PlantillaContenido _plantContenidoSeleccionado;

        #endregion

        #region " Controles Plantilla "

        /// <summary>
        /// Buscar plantillas
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void tsButBuscar_Click(object sender, EventArgs e)
        {
            this.BuscarPlantillas(this.tsTxtBuscar.Text.Trim());
        }

        /// <summary>
        /// cargar plantillasContenido cuando index cambia.
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void listPlantillas_SelectedIndexChanged(object sender, EventArgs e)
        {
            ListView.SelectedListViewItemCollection lv = listPlantillas.SelectedItems;

            foreach (ListViewItem item in lv)
            {
                _plantillaSeleccionada = SosBL.DataBL.GetPlantillaById((int)item.Tag);
                this.CargarPlantillaContenidos();
            }
        }


        /// <summary>
        /// Añadir Plantilla
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void butAñadirPlantilla_Click(object sender, EventArgs e)
        {
            this.PlantillaAñadir();
        }

        /// <summary>
        /// Editar Plantilla
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void butEditarPlantilla_Click(object sender, EventArgs e)
        {
            this.PlantillaEditar();
        }


        /// <summary>
        /// Borrar plantilla
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void butBorrarPlantilla_Click(object sender, EventArgs e)
        {
            this.PlantillaBorrar();
        }

        /// <summary>
        /// Buscar plantilla al pular intro
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void tsTxtBuscar_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                this.BuscarPlantillas(this.tsTxtBuscar.Text);
            }
        }

        /// <summary>
        /// Añadir plantillaContenido en el listView
        /// </summary>
        /// <param name="plantillaContenido">PlantillaContenido</param>
        private void AñadirPlantillaContenidoEnList(PlantillaContenido plantillaContenido)
        {
            ListViewItem listItem = new ListViewItem();
            listItem.Text = String.Format("({0}) - {1}", plantillaContenido.Idioma, plantillaContenido.Nombre);
            listItem.Tag = plantillaContenido.Id;
            listItem.ImageIndex = 0;

            listPlantillasContenido.Items.Add(listItem);
        }

        /// <summary>
        /// Refrescar datos
        /// Recarga todas las plantillas
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void tsButRefrescar_Click(object sender, EventArgs e)
        {
            this.Refrescar();
        }

        /// <summary>
        /// Borrar texto predeterminado
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void tsTxtBuscar_Enter(object sender, EventArgs e)
        {
            if (this.tsTxtBuscar.Text == "Escriba aquí para buscar plantillas...")
            {
                this.tsTxtBuscar.Text = "";
            }
        }

        /// <summary>
        /// Establecer texto por defecto
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void tsTxtBuscar_Leave(object sender, EventArgs e)
        {
            if (this.tsTxtBuscar.Text.Trim() == "")
            {
                this.tsTxtBuscar.Text = "Escriba aquí para buscar plantillas...";
            }
        }


        /// <summary>
        /// Ver uocSais
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void butUOCsais_Click(object sender, EventArgs e)
        {
            this.verUOCsais();
        }

        /// <summary>
        /// Mostrar uocSais
        /// </summary>
        private void verUOCsais()
        {
            FormUOCsais UOCsaisFrm = new FormUOCsais(_plantillaSeleccionada);
            UOCsaisFrm.MdiParent = this.ParentForm;
            UOCsaisFrm.Show();
        }
        #endregion

        #region " Controles PlantillaContenido "

        /// <summary>
        /// Cargar datos de PlantillaContenido
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void listPlantillasContenido_SelectedIndexChanged(object sender, EventArgs e)
        {
            ListView.SelectedListViewItemCollection Selecteditems = listPlantillasContenido.SelectedItems;
            try
            {
                foreach (ListViewItem item in Selecteditems)
                {
                    using (var db = new sosContext())
                    {
                        _plantContenidoSeleccionado = (from pc in db.PlantillaContenidos.Where(pc => pc.Id == (int)(item.Tag)) select pc).FirstOrDefault();
                        this.cargarDatosPlantillaContenido(_plantContenidoSeleccionado);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }


        /// <summary>
        /// Añadir PlantillaContenido
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void butAñdirContenidoPlantilla_Click(object sender, EventArgs e)
        {
            this.PlantillaContenidoAñadir();
        }

        /// <summary>
        /// Borrar PlantillaContenido
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void butBorrarPlantillaContenido_Click(object sender, EventArgs e)
        {
            this.PlantillaContenidoBorrar();
        }


        /// <summary>
        /// Ver/Editar PlantillaContenido
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void butVerEditar_Click(object sender, EventArgs e)
        {
            this.PlantillaContenidoEditar();
        }

        /// <summary>
        /// Previsualizar PlantillaContenido
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void butVerPlantillaContenido_Click(object sender, EventArgs e)
        {
            this.Previsualizar();
        }

        /// <summary>
        /// Previsualizar plantillaContenido
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void listPlantillasContenido_DoubleClick(object sender, EventArgs e)
        {
            Previsualizar();
        }

        #endregion

        #region " Controles Grupo "

        /// <summary>
        /// Ir a la Tabla grupos para gestionar
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void butSettings_Click(object sender, EventArgs e)
        {
            IrGrupoForm();
        }

        /// <summary>
        /// Cargar plantillas del grupo seleccionado
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void cmbGrupos_SelectedIndexChanged(object sender, EventArgs e)
        {
            CargarPlantillas();
        }

        #endregion

        #region " Metodos Grupo "

        /// <summary>
        /// Cargar grupos
        /// </summary>
        private void CargarGrupos()
        {
            using (var ctx = new sosContext())
            {
                var grupos = from g in ctx.GruposPlantilla select g;
                this.cmbGrupos.DataSource = grupos.ToList();
                this.cmbGrupos.DisplayMember = "Nombre";
            }
        }

        /// <summary>
        /// ir a tabla de grupos para gestionar
        /// </summary>
        private void IrGrupoForm()
        {
            FormTablaGrupo grupoFrm = new FormTablaGrupo();
            grupoFrm.MdiParent = this.MdiParent;
            grupoFrm.Show();
        }



        #endregion

        #region " Metodos Plantilla "

        /// <summary>
        /// Cargar plantillas y añadirlas en el control listView
        /// </summary>
        private void CargarPlantillas()
        {
            listPlantillas.Items.Clear();
            listPlantillasContenido.Items.Clear();

            var plantillas = SosBL.DataBL.GetPlantillaListByGroup(this.cmbGrupos.Text);

            foreach (Plantilla plantilla in plantillas)
            {
                ListViewItem item = new ListViewItem();
                item.Text = plantilla.Nombre;
                item.Tag = plantilla.Id;
                item.ToolTipText = plantilla.Descripcion;
                item.ImageIndex = 1;

                listPlantillas.Items.Add(item);
            }

            CargarPlantillasEnContextMenu();
        }

        /// <summary>
        /// AñadirPlantilla
        /// </summary>
        private void PlantillaAñadir()
        {
            Plantilla _plantilla = new Plantilla();
            _plantilla.Grupo = this.cmbGrupos.Text;
            FormPlantillaEditor PlantillaFrm = new FormPlantillaEditor(_plantilla);
            PlantillaFrm.ModoForm = FormDetalle._modoForm.Añadir;
            PlantillaFrm.ShowDialog();

            if (!PlantillaFrm.cancelado)
            {
                this.CargarPlantillas();
            }
        }

        /// <summary>
        /// Editar plantilla Seleccionada.
        /// </summary>
        private void PlantillaEditar()
        {
            try
            {
                FormPlantillaEditor PlantillaFrm = new FormPlantillaEditor(_plantillaSeleccionada);
                PlantillaFrm.ModoForm = FormDetalle._modoForm.Editar;
                PlantillaFrm.ShowDialog(this);

                if (!PlantillaFrm.cancelado)
                {
                    this.CargarPlantillas();
                }
            }
            catch { }
        }

        /// <summary>
        /// Borrar plantilla seleccionada
        /// </summary>
        private void PlantillaBorrar()
        {
            try
            {
                if (MessageBox.Show("¿Seguro que quiere eliminar la plantilla y todo su contenido?", "Eliminar plantilla", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.Yes)
                {
                    SosBL.DataBL.DeletePlantilla(_plantillaSeleccionada);
                    CargarPlantillas();
                }
            }
            catch { }
        }

        /// <summary>
        /// Buscar plantillas
        /// </summary>
        private void BuscarPlantillas(string criteria)
        {
            listPlantillasContenido.Items.Clear();

            var PlantillaContenidosEncontradas = DataBL.FindPlantillas(criteria.ToLower());

            foreach (var item in PlantillaContenidosEncontradas)
            {
                AñadirPlantillaContenidoEnList(item);
            }
        }

        /// <summary>
        /// Refrescar datos
        /// </summary>
        private void Refrescar()
        {
            CargarGrupos();
            CargarPlantillas();
        }

        #endregion

        #region " Metodos PlantillaContenido "

        /// <summary>
        /// Cargar plantillas contenidos de la plantilla seleccionada
        /// </summary>
        /// <param name="PlnatillaId"></param>
        private void CargarPlantillaContenidos()
        {
            listPlantillasContenido.Items.Clear();

            using (sosContext context = new sosContext())
            {
                _plantillaSeleccionada = (from p in context.Plantillas where p.Id == _plantillaSeleccionada.Id select p).FirstOrDefault();
                try
                {
                    foreach (PlantillaContenido pc in _plantillaSeleccionada.PlantillaContenidos)
                    {
                        this.AñadirPlantillaContenidoEnList(pc);
                    }
                }

                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }

        /// <summary>
        /// Cargar datos de la plantillaContenido seleccionado
        /// </summary>
        /// <param name="PlantillaContenidoId">PlantillaContenido</param>
        void cargarDatosPlantillaContenido(PlantillaContenido pc)
        {
            this.cmbGrupos.Text = pc.Plantillas.Grupo;
            _plantillaSeleccionada = pc.Plantillas;
            _plantContenidoSeleccionado = pc;

            this.txtPlantillaContenidoDescripcion.Text = pc.Descripcion;
            this.txtParametros.Text = SosBL.DataBL.GetParametrosPlantillaContenido(pc);
            this.txtPlantillaContenido.Text = pc.Texto;
            this.txtComentarios.Text = pc.Comentario;
            this.txtTipologia.Text = pc.Tipologia;
        }

        void cargarDatosPlantillaContenidoDesdeExplorador(PlantillaContenido pc)
        {
            cargarDatosPlantillaContenido(pc);
            CargarPlantillaContenidos();
            this.listPlantillasContenido.Items[pc.Id].Selected = true;
        }

        /// <summary>
        /// Añadir PlantillaContenido
        /// </summary>
        private void PlantillaContenidoAñadir()
        {
            using (var db = new sosContext())
            {
                PlantillaContenido pc = new PlantillaContenido();
                FormPlantillaContenidoEditor PlantContenidoFrm = new FormPlantillaContenidoEditor(pc, _plantillaSeleccionada);
                PlantContenidoFrm.ModoForm = FormDetalle._modoForm.Añadir;

                PlantContenidoFrm.ShowDialog();

                if (!PlantContenidoFrm.cancelado)
                {
                    pc = PlantContenidoFrm._plantillaContenido;
                    var plantillas = (from p in db.Plantillas.Where(p => p.Id == _plantillaSeleccionada.Id) select p).FirstOrDefault();
                    plantillas.PlantillaContenidos.Add(pc);
                    db.SaveChanges();
                    CargarPlantillaContenidos();
                }
            }
        }

        /// <summary>
        /// Editar PlantillaContenido
        /// </summary>
        private void PlantillaContenidoEditar()
        {
            using (var db = new sosContext())
            {
                PlantillaContenido pc = _plantContenidoSeleccionado;
                FormPlantillaContenidoEditor PlantContenidoFrm = new FormPlantillaContenidoEditor(pc);
                PlantContenidoFrm.ModoForm = FormDetalle._modoForm.Editar;

                PlantContenidoFrm.ShowDialog();
                if (!PlantContenidoFrm.cancelado)
                {
                    pc = PlantContenidoFrm._plantillaContenido;
                    db.SaveChanges();
                    CargarPlantillaContenidos();
                }
            }
        }


        /// <summary>
        /// Borrar PlantillaContenido
        /// </summary>
        private void PlantillaContenidoBorrar()
        {
            if (MessageBox.Show("¿Seguro que quiere eliminar esta(s) plantilla(s)?", "Eliminar plantilla(s)", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.Yes)
            {
                foreach (ListViewItem item in listPlantillasContenido.SelectedItems)
                {
                    using (var db = new sosContext())
                    {
                        PlantillaContenido pc = (from _pc in db.PlantillaContenidos.Where(_pc => _pc.Id == (int)item.Tag) select _pc).FirstOrDefault();

                        db.PlantillaContenidos.Remove(pc);
                        db.SaveChanges();
                        item.Remove();
                    }
                }
            }
        }

        /// <summary>
        /// Previsualizar PlantillaContenido
        /// </summary>
        private void Previsualizar()
        {
            foreach (ListViewItem item in listPlantillasContenido.SelectedItems)
            {
                PlantillaContenido pc = DataBL.GetPlantillaContenidoById((int)item.Tag);
                FormPlantillaContenidoPreview plantillaPreview = new FormPlantillaContenidoPreview(pc);
                //Form2 plantillaPreview = new Form2(pc);
                plantillaPreview.MdiParent = this.ParentForm;
                plantillaPreview.Show();
            }
        }

        /// <summary>
        /// Cargar todas las plantillas en el menu contextual
        /// </summary>
        private void CargarPlantillasEnContextMenu()
        {
            using (var db = new sosContext())
            {
                var plantillas = from p in db.Plantillas orderby p.Nombre select p;

                foreach (Plantilla plantilla in plantillas)
                {
                    ToolStripItem item = new ToolStripMenuItem();
                    item.Text = plantilla.Nombre;
                    item.Tag = plantilla.Id;

                    contextMenuMover.Items.Add(item);
                }
            }
        }

        #endregion

        #region " Eventos "

        /// <summary>
        /// Abrir explorador plantillas
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void listPlantillas_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Control && e.KeyCode == Keys.E)
            {
                FormExploradorPlantilla Explorador = new FormExploradorPlantilla();
                Explorador.delEvent += new FormExploradorPlantilla.del(cargarDatosPlantillaContenidoDesdeExplorador);
                Explorador.MdiParent = this.MdiParent;
                Explorador.Show();
            }
        }

        #endregion

        #region " ContextMenus "

        /// <summary>
        /// ContextMenuPlantilla Añadir
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void añadirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.PlantillaAñadir();
        }

        /// <summary>
        /// ContextMenuPlantilla Editar
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void editarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            PlantillaEditar();
        }

        /// <summary>
        /// ContextMenuPlantilla Borrar
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void borrarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            PlantillaBorrar();
        }

        //==================================================================================
        //PlantillaContenido contextMeu
        //==================================================================================
        /// <summary>
        /// contextMenuPlantillaContenido Añadir
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void añadirToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            this.PlantillaContenidoAñadir();
        }

        /// <summary>
        /// contextMenuPlantillaContenido Editar
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void editarToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            this.PlantillaContenidoEditar();
        }

        /// <summary>
        /// contextMenuPlantillaContenido Borrar
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void borrarToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            this.PlantillaContenidoBorrar();
        }

        /// <summary>
        /// Duplicar PlantillaContenido
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void duplicarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DataBL.DuplicarPlantillaContenido(_plantContenidoSeleccionado);
            this.CargarPlantillaContenidos();

        }

        /// <summary>
        /// Buscar respuesta
        /// </summary>
        /// <param name="sender">sender</param>
        /// <param name="e">e</param>
        private void tslblBuscarRespuesta_Click(object sender, EventArgs e)
        {
            FormBuscarRespuesta RespuestaFrm = new FormBuscarRespuesta();
            RespuestaFrm.Show();
        }

        /// <summary>
        /// Mover plantillaContenido a otro grupo de plantilla
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void contextMenuMover_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            foreach (ListViewItem item in listPlantillasContenido.SelectedItems)
            {
                using (var db = new sosContext())
                {
                    int PlantillaId = Convert.ToInt16(e.ClickedItem.Tag);
                    PlantillaContenido pc = (from pl in db.PlantillaContenidos.Where(pl => pl.Id == (_plantContenidoSeleccionado.Id)) select pl).FirstOrDefault();
                    pc.Plantillas = (from p in db.Plantillas.Where(p => p.Id == PlantillaId) select p).FirstOrDefault();
                    db.SaveChanges();
                    item.Remove();

                }
            }
        }

        //==================================================================================


        #endregion

    }
}
